﻿function JuegoBuscaminas() {
    MotorJuego.call(this);    
    this.tileSize = 32;
    this.mapHeight = 25;
    this.mapWidth = 25;
    //casillas por fila en la imagen de dibuar el mapa
    this.tilesPerRow = 16;
    
    this.actualizando = false;
    this.partidaActiva = false;
    this.accionActiva = -1;   
    this.idJugador = "";
    this.tipoBarco = -1;   
    this.turno = false;
    this.barco = null;     
    this.movimientos = -1;
    this.visibilidad = 0;
    this.estado = -1;
}
JuegoBuscaminas.prototype = new MotorJuego();
JuegoBuscaminas.prototype.constructor = JuegoBuscaminas;

JuegoBuscaminas.prototype.init = function(ctx){
    var that = this;
    $("#estadoTurno").html("Esperando Turno");       
    $("#btnEjecutarAccion").attr("disabled","disabled");
    $("#btnFinalizarTurno").attr("disabled","disabled");
    $("[name='accion']").attr("disabled","disabled");

    $("[name='accion']").live('change', function(){ 
       var val = $(this).val();
       if(val == TipoAccion.DISPARAR
            || val == TipoAccion.DESACTIVAR_MINA_SUPERFICIAL          
            || val == TipoAccion.MOVERSE)
       {
            $("#btnEjecutarAccion").attr("disabled", "disabled");
            $("#btnEjecutarAccion").val("Seleccione coordenadas");

       }
       else{
            $("#btnEjecutarAccion").removeAttr("disabled");
            $("#btnEjecutarAccion").val("Ejecutar Accion");
       }
       that.accionActiva = val;
    });

    $("#btnFinalizarTurno").click(function(){
        //FinalizarTurno 
        $.getJSON('FinalizarTurno?idJugador=' + that.idJugador + "&t=" + new Date().getTime(), function(){
            //Actualizar
            //that.actualizar();
        });

    });

    $("#btnEjecutarAccion").click(function(){
        if(that.accionActiva == -1){
            alert("Seleccione una accion.");
        }   
        //if(this.turno){
            that.ejecutarAccion(that.barco.x, that.barco.y);            
        //}       
    });

    MotorJuego.prototype.init.call(this, ctx);
}

JuegoBuscaminas.prototype.ejecutarAccion = function(x, y){   
    if(!this.turno){
        alert("No tiene el turno asignado para ejecutar una acción");
    }
    else if(this.estado != TipoEstado.CARGANDO){
        var that = this;
        $.getJSON('EjecutarAccion?idJugador=' + this.idJugador + '&tipoAccion=' + this.accionActiva + '&coords=' + JSON.stringify({X: x, Y: y }) + "&t=" + new Date().getTime(),
            function(respuesta){
                if(!respuesta.hayError){
                    if(respuesta.permitida){                
                        that.movimientos = respuesta.movimientosRestantes;                                                   
                    }
                    else{
                        alert(respuesta.mensaje);
                    }
                }
                else{
                    alert(respuesta.mensajeError);
                }
                //that.actualizar();
            });
    }
    else{
        alert("Esperando que se una el otro jugador");
    }    
}

JuegoBuscaminas.prototype.start = function (partida, tipoBarco, partidaNueva) {
    this.idJugador = partida.idJugador;
    this.tipoBarco = tipoBarco;
    this.movimientosPorTurno = partida.movimientosPorTurno;
    this.movimientos = this.movimientosPorTurno;
    this.entities = [];

    if(partidaNueva){
        this.inicializarMiBarco(partida, tipoBarco, true);
    }
    else{        
        this.inicializarObjetos(partida);
        this.inicializarMiBarco(partida, tipoBarco, false);
    } 

    this.visibilidad = juego.stats.barco.visibilidad;   
    
    this.partidaActiva = true;
    MotorJuego.prototype.start.call(this);
}

JuegoBuscaminas.prototype.inicializarObjetos = function(partida){
    if(partida.objetos.length > 0){
        var obj = null;
        var objADibujar = null;
        for (var i = partida.objetos.length - 1; i >= 0; i--) {
            obj = partida.objetos[i]
            objADibujar = this.crearObjeto(obj.tipo, partida, { x: obj.x, y: obj.y });
            this.dibujarObjeto(objADibujar);
            if(obj.tipo == this.tipoBarco){
                this.barco = objADibujar;
            }
        };      
    }
}

JuegoBuscaminas.prototype.inicializarMiBarco = function(partida, tipoBarco, dibujarBarco){      
    if(dibujarBarco){
        var objeto = this.crearObjeto(tipoBarco, partida);  
        this.dibujarObjeto(objeto);        
        this.barco = objeto;
    }

    switch(parseInt(tipoBarco)){
        case TipoObjeto.BARREMINAS:
            this.stats = partida.barreminas;
            break;
        case TipoObjeto.BARCOMINADOR:
            this.stats = partida.minador;
            break;
    }
}

JuegoBuscaminas.prototype.update = function () {
    MotorJuego.prototype.update.call(this);
    $("#movimientosDisponibles").html("Movimientos: " + this.movimientos);

    //si el input de mouse tiene datos cargados, asigno coordenadas a paleta de acciones
    if (this.mouse) {
        $("#y").html(this.mouse.row);
        $("#x").html(this.mouse.col);
    }

    //si el input de click fue disparado y tengo el turno habilitado, pregunto si deseo ejecutar accion
    if(this.click){
        //if(confirm("Seguro desea ejecutar la acción seleccionada en el lugar seleccionado?")){
            this.ejecutarAccion(this.click.col, this.click.row);       
        //}
    }
}

JuegoBuscaminas.prototype.draw = function () {    
    
    MotorJuego.prototype.draw.call(this, function (juego) { 
        if(!juego.actualizando){      
            ctx.beginPath();
            ctx.strokeStyle = "yellow";
            ctx.arc((juego.tileSize * juego.barco.x) + (juego.tileSize / 2), (juego.tileSize * juego.barco.y) + (juego.tileSize / 2), 16, 0, Math.PI * 2, false);
            ctx.stroke();
            ctx.closePath();             
        }       
    });
}

JuegoBuscaminas.prototype.drawGrid = function (color) {
    this.ctx.save();

    this.ctx.lineWidth = 1;
    this.ctx.strokeStyle = color;

    // horizontal grid lines
    for (var i = 0; i <= canvas.height; i = i + this.tileSize) {
        this.ctx.beginPath();
        this.ctx.moveTo(0, i);
        this.ctx.lineTo(canvas.width, i);
        this.ctx.closePath();
        this.ctx.stroke();
    }

    // vertical grid lines
    for (var j = 0; j <= canvas.width; j = j + this.tileSize) {
        this.ctx.beginPath();
        this.ctx.moveTo(j, 0);
        this.ctx.lineTo(j, canvas.height);
        this.ctx.closePath();
        this.ctx.stroke();
    }

    this.ctx.restore();
}

JuegoBuscaminas.prototype.drawMap = function (gridPixelSize, color) {

    for (var rowCtr=0;rowCtr<this.mapHeight;rowCtr++) {
        for (var colCtr=0;colCtr<this.mapWidth;colCtr++){
            var tileId = tileMap[rowCtr][colCtr]-1;
            var sourceX = Math.floor(tileId % this.tilesPerRow) * this.tileSize;
            var sourceY = Math.floor(tileId / this.tilesPerRow) * this.tileSize;
            ctx.drawImage(MANEJADOR_RECURSOS.getAsset('img/default.png'), sourceX, sourceY,this.tileSize,this.tileSize,colCtr*this.tileSize,rowCtr*this.tileSize,this.tileSize,this.tileSize);
        }
    }
}

JuegoBuscaminas.prototype.cargarAcciones = function(acciones){
   var descripcion, consume, idTipoAccion;
   $("#paletaAcciones").empty();
    for(var i=0; i < acciones.length; i++){
        descripcion = acciones[i].descripcion;
        consume = acciones[i].consume;
        idTipoAccion = acciones[i].idTipoAccion;        
        $("#paletaAcciones").append("<input id='rb_" + idTipoAccion + "' type='radio' name='accion' value='" + idTipoAccion + "' /><label for='rb_" + idTipoAccion + "'>" + descripcion + "&nbsp;-&nbsp;" + consume + "m</label><br>");

    }
}

JuegoBuscaminas.prototype.finalizarPartida = function(){
    juego.partidaActiva = false;
    $.getJSON('FinalizarPartida?idJugador=' + this.idJugador + "&t=" + new Date().getTime(), function(){ }); 
    alert('La partida ha finalizado');
    location.href = location.href   
}

JuegoBuscaminas.prototype.crearObjeto = function(tipoObjeto, partida, posicion){
    var obj = null;
    switch(parseInt(tipoObjeto)){
        case TipoObjeto.BARCOCARGUERO :
            obj = new Barco(this, partida.carguero.barco.angulo, partida.carguero.barco.velocidad, posicion.x, posicion.y, partida.carguero.barco.objeto.img, partida.carguero.barco.objeto.tipo);
            break;
        case TipoObjeto.BARREMINAS :
            obj = new Barco(this, partida.barreminas.barco.angulo, partida.barreminas.barco.velocidad, partida.barreminas.barco.objeto.x, partida.barreminas.barco.objeto.y, partida.barreminas.barco.objeto.img, partida.barreminas.barco.objeto.tipo);
            break;
        case TipoObjeto.BARCOMINADOR :
            obj = new Barco(this, partida.minador.barco.angulo, partida.minador.barco.velocidad, partida.minador.barco.objeto.x, partida.minador.barco.objeto.y, partida.minador.barco.objeto.img, partida.minador.barco.objeto.tipo);
            break;
        case TipoObjeto.MINASUBACUATICA :
            obj = new Mina(this, posicion.x, posicion.y, "img/minasubmarina.png");
            break;
        case TipoObjeto.MINASUPERFICIE :
            obj = new Mina(this, posicion.x, posicion.y, "img/minasuperficial.png");            
            break;
    }
    return obj;
}

JuegoBuscaminas.prototype.obtenerBarco = function(tipo){
    var encontre = false;
    var i = 0;
    var barco = null;
    while(!encontre){
        if(this.entities[i].tipoObjeto == tipo){
            barco = this.entities[i];
            encontre = true;
        }
        i++;        
    }
    return barco;
}

JuegoBuscaminas.prototype.obtenerMina = function(posicion){
    var encontre = false;
    var i = 0;
    var mina = null;
    while(!encontre){
        if((this.entities[i].tipoObjeto == TipoObjeto.MINASUPERFICIE
            || TipoObjeto.MINASUBACUATICA)
            && posicion.x == this.entities[i].x
            && posicion.y == this.entities[i].y){
            mina = this.entities[i];
            encontre = true;
        }
        i++;        
    }
    return mina;
}

JuegoBuscaminas.prototype.dibujarObjeto = function(objeto, alPrincipio){       
        this.agregarObjeto(objeto, alPrincipio);
}

JuegoBuscaminas.prototype.actualizar = function(){
    var that = this;
    $.getJSON('Actualizar?idJugador=' + this.idJugador + "&t=" + new Date().getTime(), function(partida){           

        if(!that.turno && partida.esMiTurno){            
            that.movimientos = that.movimientosPorTurno;
        }
    
        that.turno = partida.esMiTurno;
        that.estado = partida.estadoPartida;


        //actualizo la informacion de los barcos
        switch(parseInt(that.tipoBarco)){
            case TipoObjeto.BARREMINAS:
                that.stats = partida.barreminas;
                break;
            case TipoObjeto.BARCOMINADOR:
                that.stats = partida.minador;
                break;
        }

        if(partida.estadoPartida == TipoEstado.TERMINADA){
            alert("La partida ha finalizado");
            location.href = location.href
            showScreen("pantallaInicio");
        }
        else if(partida.estadoPartida == TipoEstado.GUARDADA){
            prompt("La partida ha sido guardada. Con este código, podrá recuperarla:", juego.idJugador);
            showScreen("pantallaInicio");
        }
        else{
            //si hubieron cambios en el estado, reflejo los cambios y verifico turno al final
            if(partida.cambiosEnMapa){  
                that.actualizando = true;
                that.reflejarActualizar(partida);            
            }   
            else{
                
                //if(!partida.esMiTurno && that.partidaActiva){//si no es mi turno y la partida sigue activa, sigo actualizando            
                if(that.partidaActiva){                    
                    that.verificarTurnoYPartida(partida);
                    that.actualizar();
                }    
            } 
        }        
        
    });
}

JuegoBuscaminas.prototype.reflejarActualizar = function(resp){     
     console.info("EMPIEZA ACTUALIZACON GRAFICA");   
     var cambios = resp.cambiosEnMapa;
     console.log(cambios);
     if(cambios.length > 0){
        this.dibujarAcciones(cambios, resp);
    }
}

JuegoBuscaminas.prototype.dibujarAcciones = function(restantes, respuesta){
    var that = this;
    if(restantes.length > 0){             
        var primera = restantes.shift();        
        this.acciones = restantes;

        var tipoResultado = primera.tipoResultado;
        var tipoObjeto = primera.tipoObjeto;
        var posicion = { x: primera.posicionAntigua.X, y: primera.posicionAntigua.Y }

        switch (tipoResultado){
            case TipoResultado.UNIDO_PARTIDA:
                console.info("UNIDO_PARTIDA");
                var tipoOpuesto = this.tipoBarco == TipoObjeto.BARREMINAS ? TipoObjeto.BARCOMINADOR : TipoObjeto.BARREMINAS ;
                var obj = this.crearObjeto(tipoOpuesto, respuesta);
                this.dibujarObjeto(obj);
                this.dibujarAcciones(this.acciones, respuesta);
                break;
            case TipoResultado.CARGUERO_UNIDO:
                console.info("CARGUERO_UNIDO");
                var carguero = this.crearObjeto(tipoObjeto, respuesta, posicion);            
                this.dibujarObjeto(carguero);
                this.dibujarAcciones(this.acciones, respuesta);
                break;
            case TipoResultado.MOVIMIENTO_BARCO:
                console.info("MOVIMIENTO_BARCO");
                var barco = this.obtenerBarco(tipoObjeto);                
                barco.move(posicion, function(obj){
                    obj.callback = null;
                    that.dibujarAcciones(juego.acciones, respuesta);
                });
                break;
            case TipoResultado.MOVIMIENTO_CARGUERO:
                console.info("MOVIMIENTO_CARGUERO");
                var carg = this.obtenerBarco(tipoObjeto);
                carg.move(posicion, function(obj){
                    obj.callback = null;
                    that.dibujarAcciones(that.acciones, respuesta);
                });
                break;
            case TipoResultado.NUEVA_MINA_SUBACUATICA:
                console.info("NUEVA_MINA_SUBACUATICA");
                var minaAcuatica = this.crearObjeto(tipoObjeto, respuesta, posicion);                
                this.dibujarObjeto(minaAcuatica, true);
                this.dibujarAcciones(this.acciones, respuesta);
                break;
            case TipoResultado.NUEVA_MINA_SUPERFICIE:
                console.info("NUEVA_MINA_SUPERFICIE");
                var minaSuperficial = this.crearObjeto(tipoObjeto, respuesta, posicion);
                this.dibujarObjeto(minaSuperficial, true);
                this.dibujarAcciones(this.acciones, respuesta);
                break;
            case TipoResultado.MINA_BARRIDA:
                console.info("MINA_BARRIDA");
                var minaBarrida = this.obtenerMina(posicion);
                minaBarrida.barrer();
                this.dibujarAcciones(this.acciones, respuesta);
                break;               
            case TipoResultado.VIRARMAS90:
                console.info("VIRARMAS90");
                var brotar = this.obtenerBarco(tipoObjeto);
                brotar.rotate(90, function(obj){
                    obj.callback = null;
                    that.dibujarAcciones(that.acciones, respuesta);
                });
                break;
            case TipoResultado.VIRARMENOS90:
                console.info("VIRARMENOS90");
                var brotar = this.obtenerBarco(tipoObjeto);
                brotar.rotate(-90, function(obj){
                    obj.callback = null;
                    that.dibujarAcciones(that.acciones, respuesta);
                });
                break;
            case TipoResultado.DISPARO:
                var b = this.obtenerBarco(tipoObjeto);
                b.disparar(posicion, function(){                    
                   that.dibujarAcciones(that.acciones, respuesta);
                });
                break;
            case TipoResultado.ESTALLA_MINA:
                console.info("ESTALLO_MINA");
                var minaEstalla = this.obtenerMina(posicion);
                minaEstalla.explotar();
                this.dibujarAcciones(this.acciones, respuesta);
                break;
            case TipoResultado.ESTALLA_CARGUERO:
                console.info("ESTALLA_CARGUERO");
                var barcoEstalla = this.obtenerBarco(tipoObjeto);
                barcoEstalla.explotar();
                this.dibujarAcciones(this.acciones, respuesta);
                break;
            case TipoResultado.ESTALLA_MINADOR:
                console.info("ESTALLA_MINADOR");
                var barcoEstalla = this.obtenerBarco(tipoObjeto);
                barcoEstalla.explotar();
                this.dibujarAcciones(this.acciones, respuesta);
                break;
            case TipoResultado.ESTALLA_BARREMINAS:
                console.info("ESTALLA_BARREMINAS");
                var barcoEstalla = this.obtenerBarco(tipoObjeto);
                barcoEstalla.explotar();
                this.dibujarAcciones(this.acciones, respuesta);
                break;                
        }
       
    }
    else{
        console.info("TERMINA ACTUALIZACON");
        //Verifico si es mi turno y si la partida finalizo
        this.verificarTurnoYPartida(respuesta);
        that.actualizando = false;
        this.actualizar();
    }
}

JuegoBuscaminas.prototype.verificarTurnoYPartida = function(respuesta){         
    //if(!this.turno && respuesta.esMiTurno){            
        //this.movimientos = this.movimientosPorTurno;      
    //}
    
    //this.turno = respuesta.esMiTurno;  
    //console.info("ESMITURNO: " + this.turno);  
    if(!this.turno && !this.actualizando){
        $("#estadoTurno").html("Esperando Turno");       
        $("#btnEjecutarAccion").attr("disabled","disabled");
        $("#btnFinalizarTurno").attr("disabled","disabled");
        $("[name='accion']").attr("disabled","disabled");
        //$("[name='accion']").attr("checked",false);
    }
    else{
        $("#estadoTurno").html("Turno Activo");
        $("#btnEjecutarAccion").removeAttr("disabled");
        $("#btnFinalizarTurno").removeAttr("disabled");
        $("[name='accion']").removeAttr("disabled");        
    }

    if(!this.actualizando){
        var msg = "";
        switch(respuesta.estadoPartida){
            case TipoEstado.TERMINADA:
                this.partidaActiva = false;
                msg = "La partida ha finalizado";
                location.href = location.href
                showScreen("pantallaInicio");
                break;
            case TipoEstado.GANO_BARREMINAS:
                //msg = this.juego.tipoBarco == TipoObjeto.BARREMINAS ? "Has ganado la partida!!" : "Has perdido :(");
                this.partidaActiva = false;
                msg = "Gano Barreminas!";
                break;
            case TipoEstado.GANO_MINADOR:
                //msg = this.juego.tipoBarco == TipoObjeto.BARCOMINADOR ? "Has ganado la partida!!" : "Has perdido :(");
                msg = "Gano Minador!";
                this.partidaActiva = false;
                break;
            case TipoEstado.EMPATE:
                msg = "Ha habido un empate";
                this.partidaActiva = false;
                alert("Ha habido un empate!");
                break;
            case TipoEstado.GUARDADA:
                prompt("La partida ha sido guardada. Con este código, podrá recuperarla:", this.juego.idJugador);
                showScreen("pantallaInicio");
                break;
        }

        if(msg != "" && !this.partidaActiva){
            alert(msg);
        }
    }
    if(!this.partidaActiva){       
        showScreen("pantallaInicio");
    }
}

JuegoBuscaminas.prototype.crearPartida = function(nombre, tipoBarco){
    $.getJSON('CrearPartida?nombrePartida=' + nombre  + '&tipoBarco=' + tipoBarco + "&t=" + new Date().getTime(), function(partida){
            if(!partida.hayError){
               for(var i = 0; i < partida.imagenes.length; i++){                  
                  MANEJADOR_RECURSOS.queueDownload(partida.imagenes[i]);
               }
               MANEJADOR_RECURSOS.downloadAll(function(){ 
                  //console.log(partida);
                  tileMap = partida.mapa;
                  juego.init(ctx);
                  juego.cargarAcciones(partida.accionesPermitidas);
                  juego.start(partida, tipoBarco, true);
                  showScreen("pantallaJuego");
                  juego.actualizar();
               });
            }
            else{
              alert(partida.mensajeError);
            }
        });     
}

JuegoBuscaminas.prototype.unirPartida = function(idPartida, tipoBarco){
    var unir = confirm("Seguro desea unirse a la partida?");
    if(unir){       
        $.getJSON('UnirPartida?idPartida=' + idPartida + "&t=" + new Date().getTime(), function(partida){
            if(!partida.hayError){
               for(var i = 0; i < partida.imagenes.length; i++){                  
                  MANEJADOR_RECURSOS.queueDownload(partida.imagenes[i]);
               }
               MANEJADOR_RECURSOS.downloadAll(function(){ 
                  console.log(partida);
                  tileMap = partida.mapa;
                  juego.init(ctx);
                  juego.cargarAcciones(partida.accionesPermitidas);
                  
                  juego.start(partida, tipoBarco, true);
                  
                  showScreen("pantallaJuego");
                  juego.actualizar();
               });
            }
            else{
              alert(partida.mensajeError);
            }
        });
    } 
}

JuegoBuscaminas.prototype.cargarPartida = function(codigo){
    var that = this;
    $.getJSON('CargarPartida?idJugador=' + codigo + "&t=" + new Date().getTime(),function(partida){        
        if(!partida.hayError){
           for(var i = 0; i < partida.imagenes.length; i++){                  
              MANEJADOR_RECURSOS.queueDownload(partida.imagenes[i]);
           }
           MANEJADOR_RECURSOS.downloadAll(function(){ 
              console.log(partida);
              tileMap = partida.mapa;
              juego.init(ctx);
              juego.cargarAcciones(partida.accionesPermitidas);
              juego.start(partida, partida.tipoBarco, false);
              showScreen("pantallaJuego");
              juego.actualizar();
           });
        }
        else{
          alert(partida.mensajeError);
        }
    });   
}

JuegoBuscaminas.prototype.guardarPartida = function(){  
    juego.partidaActiva = false;
    $.getJSON('GuardarPartida?idJugador=' + this.idJugador + "&t=" + new Date().getTime(),function(){
        alert("La partida ha sido guardada");        
        showScreen("pantallaInicio");     
    });   
}

JuegoBuscaminas.prototype.listarPartidas = function(){
    var that = this;
    $.getJSON('ListarPartidas?t=' + new Date().getTime(), function(partidas){
        $("#listarPartidas").empty();
        $("#listarPartidas").append("<table id='tblPartidas' align='center'></table>");
        $("#listarPartidas table").append("<tr><th>Nombre</th><th>Barco Disponible</th><th>Fecha</th><th></th></tr>");
        //chequear que no sea null
        if(partidas != null){
            for(var i = 0; i < partidas.length; i++){
                var bDisp =  partidas[i].barcoDisponible;
                if(bDisp == TipoObjeto.BARREMINAS){
                  bDisp = "Barreminas";
                }
                else if(bDisp == TipoObjeto.BARCOMINADOR){
                  bDisp = "Minador";
                }
                $("#pantallaListaPartidas table").append("<tr><td>" + partidas[i].nombPartida + "</td><td>" + bDisp + "</td><td>" + partidas[i].fechaCreacion + "</td><td><a id='lnkUnirPartida' href=" + partidas[i].idPartida + " barco='" + partidas[i].barcoDisponible + "'>Unir</a></td></tr>");
            }
        }        
    });
    $("#lnkUnirPartida").live("click", function(){
        var idPartida = $(this).attr("href");
        var tipoBarco = $(this).attr("barco");
        that.unirPartida(idPartida, tipoBarco);
        return false;       
    });
    showScreen("pantallaListaPartidas");
}